12470
15381
Jelenleg egy alapvető értelmezőt írok egy XML ízhez. Gyakorlatként egy LL tábla vezérelt elemzőt valósítok meg.
Ez az én példám a BNF nyelvtanára:
% token name data string
%% / * LL (1) * /
doc: elem
elem: "<" open_tag
open_tag: név attr close_tag
close_tag: ">" elem_or_data ""
| "/>"
;
elem_or_data: "<" open_tag elem_or_data
| adatok elem_vagy_adatok
| / * epsilon * /
;
attr: name ":" string attr
| / * epsilon * /
;
Helyes ez a nyelvtan?
Minden terminál literál idézőjelek között van. Az absztrakt terminálokat% token adja meg.
Kézzel írt lexert kódolok, hogy a bemenetemet tokenek listájává alakítsam át. Hogyan jelölném az absztrakt terminálokat? 
A klasszikus megközelítés az lenne, ha reguláris kifejezést (vagy más felismerőt) írnánk minden lehetséges terminálra.
Azok, amelyeket "absztrakt" termináloknak neveztek, amelyek teljesen konkrétak, valójában azok a terminálok, amelyekhez tartozó minták egynél több lehetséges bemeneti karakterláncot ismernek fel. A ténylegesen felismert karakterláncot (vagy a karakterlánc valamilyen kiszámított függvényét) át kell adni az elemzőnek a token szemantikai értékeként.
Névlegesen a beviteli karakterlánc minden pontján a tokeniser lefuttatja az összes felismerőt, és kiválasztja a leghosszabb egyezést. (Ez az úgynevezett "maximal munch" szabály.) Ez általában optimalizálható, különösen, ha az összes minta szabályos kifejezés. (F) A lex például elvégzi ezt az optimalizálást az Ön számára.
Esetükben bonyolult tény, hogy nyelvének tokenizálása kontextustól függ. Különösen, ha a cél elem_vagy_adat, akkor az egyetlen lehetséges token a <,